Tanz der Sprites

← Zurück zum Forum

.... und damit es übersichtlicher wird, beginne ich von ganz vorne und nenne es Tanz der Sprites!

Das kleine Programm wird dann folgendes erzeugen:

TdS.MOV

Gruß

Peter

Anhänge:

... und hier schon mal der komplette Code vorab:

            org 4096


dlist   .by 117,117,117
        .by 93,210,155
        .by 93,0,156        
        .by 93,80,156
        .by 93,160,156

        .by 93,0,157
        .by 93,80,157
        .by 221,160,157

        .by 93,0,158
        .by 93,80,158
        .by 93,160,158  

        .by 93,0,159
        .by 93,80,159
        .by 93,160,159  

        .by 93,0,160        
        .by 93,80,160
        .by 93,160,160

        .by 93,0,161
        .by 93,80,161
        .by 221,160,161

        .by 93,0,162
        .by 93,80,162
        .by 93,160,162

        .by 93,0,163
        .by 93,80,163
        .by 93,160,163

        .by 93,0,164        
        .by 93,80,164
        .by 93,160,164

        .by 93,0,165
        .by 93,80,165
        .by 93,160,165

        .by 93,0,166
        .by 93,80,166
        .by 93,160,166  

        .by 93,0,167
        .by 93,80,167
        .by 93,160,167

        .by 93,0,168    
        .by 93,80,168
        .by 93,160,168

        .by 93,0,169
        .by 93,80,169
        .by 93,160,169

        .by 93,0,170
        .by 93,80,170
        .by 93,160,170

        .by 93,0,171
        .by 93,80,171
        .by 93,160,171

        .by 93,0,172
        .by 93,80,172
        .by 93,160,172

        .by 93,0,173
        .by 93,80,173
        .by 93,160,173

        .by 93,0,174
        .by 93,80,174
        .by 93,160,174

        .by 93,0,175
        .by 93,80,175
        .by 93,160,175

        .by 93,0,176    
        .by 93,80,176
        .by 93,160,176

        .by 93,0,177
        .by 93,80,177
        .by 93,160,177

        .by 93,0,178
        .by 93,80,178
        .by 93,160,178

        .by 93,0,179
        .by 93,80,179
        .by 93,160,179

        .by 93,0,180    
        .by 93,80,180
        .by 93,160,180

        .by 93,0,181
        .by 93,80,181
        .by 93,160,181

        .by 93,0,182
        .by 93,80,182
        .by 93,160,182

        .by 93,0,183
        .by 93,80,183
        .by 93,160,183

        .by 93,0,184
        .by 93,80,184
        .by 93,160,184

        .by 93,0,185
        .by 93,80,185
        .by 93,160,185

        .by 93,0,186
        .by 93,80,186
        .by 93,160,186

        .by 93,0,187
        .by 93,80,187
        .by 221,160,187
        .by 65
        .wo dlist


display = 228
display99 = 230
                    ;------ Speicher und Variablen für Player allgemein ----------
display1 = 232
display2 = 234
display3 = 236
display199 = 238
display299 = 240
display399 = 242
tmp1 = 1000     
tmp2 = 1001
tmp3 = 1002
tmp4 = 1003
tmp5 = 1004
tmp6 = 1005
tmp7 = 1006
tmp8 = 1007
tmp9 = 1008
displayzw = 1009
ystore = 1011
xstore = 1012
beweg = 1013
                ;------ Variablen für die Warteschleifen -----------------------
delay = 1020
schleife1 = 1021
schleife2 = 1022
                ;------ Variablen für Player1 ----------------------------------
zaehler1 = 1100
display11 = 1102
display21 = 1104
display31 = 1106
tmp11 = 1108        
tmp21 = 1109
tmp31 = 1110
tmp41 = 1111
tmp51 = 1112
tmp61 = 1113
tmp71 = 1114
tmp81 = 1115
tmp91 = 1116
displayzw1 = 1117
ystore1 = 1118
xstore1 = 1119

                ;------ Variablen für Player2 ----------------------------------

zaehler2 = 1120
display12 = 1122
display22 = 1124
display32 = 1126
tmp12 = 1128        
tmp22 = 1129
tmp32 = 1130
tmp42 = 1131
tmp52 = 1132
tmp62 = 1133
tmp72 = 1134
tmp82 = 1135
tmp92 = 1136
displayzw2 = 1137
ystore2 = 1138
xstore2 = 1139
                ;------ Variablen für Player3 ----------------------------------

zaehler3 = 1140
display13 = 1142
display23 = 1144
display33 = 1146
tmp13 = 1148        
tmp23 = 1149
tmp33 = 1150
tmp43 = 1151
tmp53 = 1152
tmp63 = 1153
tmp73 = 1154
tmp83 = 1155
tmp93 = 1156
displayzw3 = 1157
ystore3 = 1158
xstore3 = 1159
                ;---------------------------------------------------------------

player11    .by 170,170,0
            .by 42,170,128
            .by 10,170,160
            .by 2,170,168
player12    .by 85,85,0
            .by 21,85,64
            .by 5,85,80
            .by 1,85,84
player13    .by 170,170,0
            .by 42,170,128
            .by 10,170,160
            .by 2,170,168           
maske11     .by 0,0,255
            .by 192,0,63
            .by 240,0,15
            .by 252,0,3
maske12     .by 0,0,255
            .by 192,0,63
            .by 240,0,15
            .by 252,0,3
maske13     .by 0,0,255
            .by 192,0,63
            .by 240,0,15
            .by 252,0,3

bewegung1   .by 3,3,3,4,4,5,5,5,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,5,5,5,6,7,7,7,7,7,7,8,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,2
bewegung2   .by 5,5,5,5,5,5,5,5,5,5,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3     
bewegung3   .by 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5     

            .proc main
            mwa #39936 display      ;--- hier fängt die Bildschirmadresse an 0,156 = 256x156
            mwa #30720 display99
            mwa #dlist 560  
            ldx #0                  ;Bildschirm füllen
            ldy #0
@           lda #11
            sta tmp1
            #if .byte tmp1>#40
            ;jmp @-
            #end
            sta (display),y
            sta (display99),y
            iny
            bne @-
            inc display+1
            inc display99+1
            clc
            inx
            cpx #31
            bne @-
            ;-------------------- Variablen Player1 init ---------          
            mva #0 display11
            mva #80 display21
            mva #160 display31
            lda #170
            sta display11+1
            sta display21+1
            sta display31+1
            mva #0 zaehler1
            ldy #34
            sty ystore1
            ;-------------------- Variablen Player2 init ---------          
            mva #0 display12
            mva #80 display22
            mva #160 display32
            lda #173
            sta display12+1
            sta display22+1
            sta display32+1
            mva #0 zaehler2
            ldy #44
            sty ystore2
            ;-------------------- Variablen Player3 init ---------          
            mva #0 display13
            mva #80 display23
            mva #160 display33
            lda #165
            sta display13+1
            sta display23+1
            sta display33+1
            mva #0 zaehler3
            ldy #44
            sty ystore3

;--------------------------Hauptprogramm----------------------------
loop        
            jsr player1
            jsr player2
            jsr player3
            mva #4 delay
            jsr warte2
            jmp loop        
            .endp
;--------------------------Subroutinen------------------------------

            .proc warte2
            mva #0 schleife1
            mva #0 schleife2
@           inc schleife1
            #if .byte schleife1<#255
            jmp @-
            #end
            mva #0 schleife1
            inc schleife2
            #if .byte schleife2<delay
            jmp @-
            #end
            rts
            .endp
            .proc player1
            mwa display11 display1
            mwa display21 display2
            mwa display31 display3
            mva tmp11 tmp1
            mva tmp21 tmp2
            mva tmp31 tmp3
            mva tmp41 tmp4
            mva tmp51 tmp5
            mva tmp61 tmp6
            mva tmp71 tmp7
            mva tmp81 tmp8
            mva tmp91 tmp9
            mva displayzw1 displayzw
            mva ystore1 ystore
            mva xstore1 xstore
            ldx zaehler1
            lda bewegung1,x
            sta beweg
            jsr player.bewegung
            inc zaehler1
            #if .byte zaehler1=#79      
            mva #0 zaehler1
            #end
            mwa display1 display11 
            mwa display2 display21 
            mwa display3 display31 
            mva tmp1 tmp11
            mva tmp2 tmp21
            mva tmp3 tmp31
            mva tmp4 tmp41
            mva tmp5 tmp51
            mva tmp6 tmp61
            mva tmp7 tmp71
            mva tmp8 tmp81
            mva tmp9 tmp91
            mva displayzw displayzw1
            mva ystore ystore1
            mva xstore xstore1
            #if .byte ystore1<=#0
            jsr player.restore
            mva #0 display11
            mva #80 display21
            mva #160 display31
            lda #170
            sta display11+1
            sta display21+1
            sta display31+1
            mva #0 zaehler1
            ldy #34
            sty ystore1
            #end
            rts
            .endp
            .proc player2
            mwa display12 display1
            mwa display22 display2
            mwa display32 display3
            mva tmp12 tmp1
            mva tmp22 tmp2
            mva tmp32 tmp3
            mva tmp42 tmp4
            mva tmp52 tmp5
            mva tmp62 tmp6
            mva tmp72 tmp7
            mva tmp82 tmp8
            mva tmp92 tmp9
            mva displayzw2 displayzw
            mva ystore2 ystore
            mva xstore2 xstore
            ldx zaehler2
            lda bewegung3,x
            sta beweg
            jsr player.bewegung
            inc zaehler2
            #if .byte zaehler2=#79      
            mva #0 zaehler2
            #end
            mwa display1 display12
            mwa display2 display22 
            mwa display3 display32 
            mva tmp1 tmp12
            mva tmp2 tmp22
            mva tmp3 tmp32
            mva tmp4 tmp42
            mva tmp5 tmp52
            mva tmp6 tmp62
            mva tmp7 tmp72
            mva tmp8 tmp82
            mva tmp9 tmp92
            mva displayzw displayzw2
            mva ystore ystore2
            mva xstore xstore2
            #if .byte ystore2<=#0
            jsr player.restore
            mva #0 display12
            mva #80 display22
            mva #160 display32
            lda #173
            sta display12+1
            sta display22+1
            sta display32+1
            mva #0 zaehler2
            ldy #44
            sty ystore2
            #end
            rts
            .endp
            .proc player3
            mwa display13 display1
            mwa display23 display2
            mwa display33 display3
            mva tmp13 tmp1
            mva tmp23 tmp2
            mva tmp33 tmp3
            mva tmp43 tmp4
            mva tmp53 tmp5
            mva tmp63 tmp6
            mva tmp73 tmp7
            mva tmp83 tmp8
            mva tmp93 tmp9
            mva displayzw3 displayzw
            mva ystore3 ystore
            mva xstore3 xstore
            ldx zaehler3
            lda bewegung2,x
            sta beweg
            jsr player.bewegung
            inc zaehler3
            #if .byte zaehler3=#79      
            mva #0 zaehler3
            #end
            mwa display1 display13
            mwa display2 display23 
            mwa display3 display33 
            mva tmp1 tmp13
            mva tmp2 tmp23
            mva tmp3 tmp33
            mva tmp4 tmp43
            mva tmp5 tmp53
            mva tmp6 tmp63
            mva tmp7 tmp73
            mva tmp8 tmp83
            mva tmp9 tmp93
            mva displayzw displayzw3
            mva ystore ystore3
            mva xstore xstore3
            #if .byte ystore3<=#0
            jsr player.restore
            mva #0 display13
            mva #80 display23
            mva #160 display33
            lda #165
            sta display13+1
            sta display23+1
            sta display33+1
            mva #0 zaehler3
            ldy #44
            sty ystore3
            #end
            rts
            .endp
            .proc player
bewegung    #if .byte beweg=#7
            jsr player.nachlinks
            #end
            #if .byte beweg=#3
            jsr player.nachrechts
            #end
            #if .byte beweg=#5
            jsr player.nachunten
            #end
            #if .byte beweg=#1
            jsr player.nachoben
            #end
            #if .byte beweg=#2
            jsr player.nachoben
            jsr player.nachrechts
            #end
            #if .byte beweg=#4
            jsr player.nachunten
            jsr player.nachrechts
            #end
            #if .byte beweg=#8
            jsr player.nachoben
            jsr player.nachlinks
            #end
            #if .byte beweg=#6
            jsr player.nachunten
            jsr player.nachlinks
            #end
            rts

nachoben    
            ldy ystore      
            ldx xstore
            jsr restore
            mva display1 displayzw
            #if .byte displayzw=#160
            mva #80 display1
            mva #160 display2
            dec  display2+1
            mva #0 display3
            #end
            #if .byte displayzw=#80
            mva #0 display1
            mva #80 display2
            mva #160 display3
            dec display3+1
            #end
            #if .byte displayzw=#0
            mva #160 display1
            dec display1+1
            mva #0 display2
            mva #80 display3
            #end
            ldy ystore
            jsr store
            ldy ystore      
            ldx xstore
            jsr print
            jsr store
            rts
nachunten   
            ldy ystore  
            ldx xstore
            jsr restore
            mva display3 displayzw
            #if .byte displayzw=#160
            mva #0 display3
            inc display3+1
            mva #80 display1
            mva #160 display2
            #end
            #if .byte displayzw=#0
            mva #80 display3
            mva #0 display2
            inc display2+1
            mva #160 display1
            #end
            #if .byte displayzw=#80
            mva #160 display3
            mva #80 display2
            mva #0 display1
            inc display1+1
            #end
            ldy ystore
            ldy ystore
            ldx xstore
            jsr print
            jsr store
            rts
nachrechts  
            ldy ystore
            ldx xstore
            inx
            inx
            inx
            stx xstore
            #if .byte xstore=#12
            ldx #0 
            stx xstore
            jsr restore
            mva tmp2 tmp1
            mva tmp3 tmp2
            mva tmp5 tmp4
            mva tmp6 tmp5
            mva tmp8 tmp7
            mva tmp9 tmp8
            inc ystore
            ldy ystore
            iny
            iny
            lda (display1),y
            sta tmp3
            clc
            ldy ystore
            iny
            iny
            lda (display2),y
            sta tmp6
            clc
            ldy ystore
            iny
            iny
            lda (display3),y
            sta tmp9
            ldy ystore
            #end
            jsr print
            jsr store
            #if .byte ystore=#45
            dey
            #end
            rts
nachlinks
            ldy ystore
            ldx xstore
            dex
            dex
            dex
            stx xstore
            #if .byte xstore=#253
            ldx #9
            stx xstore
            jsr restore
            mva tmp2 tmp3
            mva tmp1 tmp2
            mva tmp5 tmp6
            mva tmp4 tmp5
            mva tmp8 tmp9
            mva tmp7 tmp8
            dec ystore
            ldy ystore
            lda (display1),y
            sta tmp1
            clc
            ldy ystore
            lda (display2),y
            sta tmp4
            clc
            ldy ystore
            lda (display3),y
            sta tmp7
            ldy ystore
            #end    
            jsr print
            jsr store
            #if .byte ystore=#1
            iny
            #end
            rts     
print                               ;Player printen + Fusion Bildschirm
            lda tmp1
            and maske11,x
            eor player11,x
            sta (display1),y
            inx
            iny
            lda tmp2
            and maske11,x
            eor player11,x
            sta (display1),y
            inx
            iny
            lda tmp3
            and maske11,x
            eor player11,x
            sta (display1),y
            ldx xstore
            clc
            ldy ystore
            lda tmp4
            and maske12,x
            eor player12,x
            sta (display2),y
            inx
            iny
            lda tmp5
            and maske12,x
            eor player12,x
            sta (display2),y
            inx
            iny
            lda tmp6
            and maske12,x
            eor player12,x
            sta (display2),y
            ldx xstore
            clc
            ldy ystore
            lda tmp7
            and maske13,x
            eor player13,x
            sta (display3),y
            inx
            iny
            lda tmp8
            and maske13,x
            eor player13,x
            sta (display3),y
            inx
            iny
            lda tmp9
            and maske13,x
            eor player13,x
            sta (display3),y

            rts
store                   ;Bildschirm in tmp sichern

            sec
            lda display1+1
            sbc #36
            sta display199+1
            sec
            lda display2+1
            sbc #36
            sta display299+1
            sec
            lda display3+1
            sbc #36
            sta display399+1
            mva display1 display199
            mva display2 display299
            mva display3 display399
            lda (display199),y          
            sta tmp1
            iny
            lda (display199),y      
            sta tmp2
            iny
            lda (display199),y          
            sta tmp3
            clc
            ldy ystore

            lda (display299),y          
            sta tmp4
            iny
            lda (display299),y      
            sta tmp5
            iny
            lda (display299),y          
            sta tmp6
            clc
            ldy ystore

            lda (display399),y          
            sta tmp7
            iny
            lda (display399),y      
            sta tmp8
            iny
            lda (display399),y          
            sta tmp9
            rts
restore                         ;tmp in Bildschirm printen (restore)
            lda tmp1
            sta (display1),y
            iny
            lda tmp2
            sta (display1),y            
            iny 
            lda tmp3
            sta (display1),y
            clc
            ldy ystore

            lda tmp4
            sta (display2),y
            iny
            lda tmp5
            sta (display2),y            
            iny 
            lda tmp6
            sta (display2),y
            clc
            ldy ystore

            lda tmp7
            sta (display3),y
            iny
            lda tmp8
            sta (display3),y            
            iny 
            lda tmp9
            sta (display3),y

            rts
            .endp



            run main

wie gesagt, läuft unter MADS, läßt sich aber leicht in die anderen Versionen konvertieren. Ich nutze gerne die #if ... #end Anweisung, wo das nicht geht, der muss das umschreiben! Alle Parts werde ich einzeln erklären...

Gruß Peter

Part 1 - die Displaylist:

        org 4096


dlist   .by 117,117,117
        .by 93,210,155
        .by 93,0,156        
        .by 93,80,156
        .by 93,160,156

        .by 93,0,157
        .by 93,80,157
        .by 221,160,157

        .by 93,0,158
        .by 93,80,158
        .by 93,160,158  

        .by 93,0,159
        .by 93,80,159
        .by 93,160,159  

        .by 93,0,160        
        .by 93,80,160
        .by 93,160,160

        .by 93,0,161
        .by 93,80,161
        .by 221,160,161

        .by 93,0,162
        .by 93,80,162
        .by 93,160,162

        .by 93,0,163
        .by 93,80,163
        .by 93,160,163

        .by 93,0,164        
        .by 93,80,164
        .by 93,160,164

        .by 93,0,165
        .by 93,80,165
        .by 93,160,165

        .by 93,0,166
        .by 93,80,166
        .by 93,160,166  

        .by 93,0,167
        .by 93,80,167
        .by 93,160,167

        .by 93,0,168    
        .by 93,80,168
        .by 93,160,168

        .by 93,0,169
        .by 93,80,169
        .by 93,160,169

        .by 93,0,170
        .by 93,80,170
        .by 93,160,170

        .by 93,0,171
        .by 93,80,171
        .by 93,160,171

        .by 93,0,172
        .by 93,80,172
        .by 93,160,172

        .by 93,0,173
        .by 93,80,173
        .by 93,160,173

        .by 93,0,174
        .by 93,80,174
        .by 93,160,174

        .by 93,0,175
        .by 93,80,175
        .by 93,160,175

        .by 93,0,176    
        .by 93,80,176
        .by 93,160,176

        .by 93,0,177
        .by 93,80,177
        .by 93,160,177

        .by 93,0,178
        .by 93,80,178
        .by 93,160,178

        .by 93,0,179
        .by 93,80,179
        .by 93,160,179

        .by 93,0,180    
        .by 93,80,180
        .by 93,160,180

        .by 93,0,181
        .by 93,80,181
        .by 93,160,181

        .by 93,0,182
        .by 93,80,182
        .by 93,160,182

        .by 93,0,183
        .by 93,80,183
        .by 93,160,183

        .by 93,0,184
        .by 93,80,184
        .by 93,160,184

        .by 93,0,185
        .by 93,80,185
        .by 93,160,185

        .by 93,0,186
        .by 93,80,186
        .by 93,160,186

        .by 93,0,187
        .by 93,80,187
        .by 221,160,187
        .by 65
        .wo dlist

org 4096 legt fest, wo das Programm startet. Nämlich bei $1000 bzw. 4096

Es folgt die Definition der Displaylist (DL) - dlist ist letztlich die Definition, an welche Speicherstelle die DL steht. Dorthin wird dann SDLSTL und SDLSTH hingebogen - hier sucht der Rechner den Vektor für die DL. 117 in der DL bedeutet 3 schwarze Blöcke am oberen Bildschirmrand. Für das Scrolling habe ich diese DL so aufgebaut. Jede Bildschirmzeile bekommt eine eigene Adresse mit Sprungbefehl. Der Befehl ist 93 und setzt sich aus 64+13+16 = 93 zusammen. 64 ist der eigentliche Sprungbefehl, 13 bedeutet Antic D Modus und 16 bedeutet horizontales Scrolling. Drei Zeilen haben noch +128 (93+128=221) - hier ist ein DL-Interrupt Einsprung vorgesehen. Für dieses Beispiel brauchen wir allerdings keinen Interrupt und kein Feinscrolling - aus der 93 / 221 könnte man auch ein 77 machen. Die DL habe ich schon für das Parallax vorbereitet...

Der eigentliche Bildschirm startet bei 0, 156 - also 0 + 256x156 = 39936 (die Zeile 93,210,155 - Adresse 39890 vergessen wir mal - die brauche ich auch fürs Parallax). Am Ende der DL kommt noch der Befehl 65 und .wo dlist - das bedeutet spring zurück zum Anfang der DL und wiederhole sie.

Das wars schon mit der DL für Antic D. Man kann das natürlich anders definieren, ich habe es aber so gewählt, weil ich damit auch für den Grobscroll eine doppelte Zeilenbreite bereitstelle. Wenn ich bei den Playern immer drei kleine Sprites gleichzeitig behandle, dann muss ich für den Zeilenwechsel wenig Aufwand treiben und nichts berechnen oder mit Masken arbeiten, die DL ist quasi meine Maske - dazu aber später. Ein kompletter Zeilenwechsel erreicht man im besten Fall einfach durch Increment oder Decrement des Highbyte.

Gruß Peter

$1000 ist meist zu tief, um das Programm später am Atari laden zu können. DOS liegt oft noch dort im Speicher. Zur Sicherheit geht für die originalen ATARI DOS eine Startadresse ab $1f00 oder gleich bei $2000. Natürlich gibt es GameDOS (z.B. MyPicoDOS) oder spezielle kurze DOS (z.B. uDOS oder auch xBOOT), die auch mit $1000 problemlos klarkommen.

PP´s of STARSOFTBerlin____github|meine Webseite|Demozoo

... ja das stimmt und ist jetzt ja auch nur ein Demoprogramm, wo man das Dos nicht braucht. Battle of Eris übrigens fängt auch bei $1000 an (da brauchte ich jeden Speicher, den ich bekommen konnte) und hat dennoch die Highscore-Option mit einem sehr schmalen Dos 😉

Ich habe es ja nur erwähnt, damit es nochmal da steht 😉

PP´s of STARSOFTBerlin____github|meine Webseite|Demozoo

            org $2000
            icl 'dlist.asm'

display = $e4
display99 = $e6
                    ;------ Speicher und Variablen für Player allgemein ----------
display1 = $e8
display2 = $ea
display3 = $ec
display199 = $ee
display299 = $f0
display399 = $f2
tmp1 = $600 
tmp2 = $601
tmp3 = $602
tmp4 = $603
tmp5 = $604
tmp6 = $605
tmp7 = $606
tmp8 = $607
tmp9 = $608
displayzw = $609
ystore = $60a
xstore = $60b
beweg = $60c
                ;------ Variablen für die Warteschleifen -----------------------
delay = $60d
schleife1 = $60e
schleife2 = $60f
                ;------ Variablen für Player1 ----------------------------------
zaehler1 = $610
display11 = $611
display21 = $613
display31 = $615
tmp11 = $617    
tmp21 = $618
tmp31 = $619
tmp41 = $61a
tmp51 = $61b
tmp61 = $61c
tmp71 = $61d
tmp81 = $61e
tmp91 = $61f
displayzw1 = $620
ystore1 = $621
xstore1 = $622

                ;------ Variablen für Player2 ----------------------------------

zaehler2 = $630
display12 = $631
display22 = $633
display32 = $635
tmp12 = $637    
tmp22 = $638
tmp32 = $639
tmp42 = $63a
tmp52 = $63b
tmp62 = $63c
tmp72 = $63d
tmp82 = $63e
tmp92 = $63f
displayzw2 = $640
ystore2 = $641
xstore2 = $642
                ;------ Variablen für Player3 ----------------------------------

zaehler3 = $650
display13 = $651
display23 = $653
display33 = $655
tmp13 = $657        
tmp23 = $658
tmp33 = $659
tmp43 = $65a
tmp53 = $65b
tmp63 = $65c
tmp73 = $65d
tmp83 = $65e
tmp93 = $65f
displayzw3 = $660
ystore3 = $661
xstore3 = $662
                ;---------------------------------------------------------------

player11    .by 170,170,0
            .by 42,170,128
            .by 10,170,160
            .by 2,170,168
player12    .by 85,85,0
            .by 21,85,64
            .by 5,85,80
            .by 1,85,84
player13    .by 170,170,0
            .by 42,170,128
            .by 10,170,160
            .by 2,170,168           
maske11     .by 0,0,255
            .by 192,0,63
            .by 240,0,15
            .by 252,0,3
maske12     .by 0,0,255
            .by 192,0,63
            .by 240,0,15
            .by 252,0,3
maske13     .by 0,0,255
            .by 192,0,63
            .by 240,0,15
            .by 252,0,3

bewegung1   .by 3,3,3,4,4,5,5,5,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,5,5,5,6,7,7,7,7,7,7,8,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,2
bewegung2   .by 5,5,5,5,5,5,5,5,5,5,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3     
bewegung3   .by 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5     

Ich habe jetzt die Variablen etwas angepasst und in die unkritische Page 6 gesetzt, außerdem startet das Programm bei $2000 Alles andere geht zwar auch, da kann es aber zu Konfikten mit dem DOS kommen.

In dem Programm definiere ich zunächst die Display-Variablen: In display steht die Anfangsbildschirmadresse ($9c00) und in display99 kommt die Bildschirmkopie rein ($7800). Ich brauche also 2 komplette Bildschirme... ein sichtbarer und eine Kopie (unsichtbar).

Es wird eine zentrale Routine geben, die den jeweiligen Player printet - da jeder Player im Prinzip aus 3 kleinen Player zusammengesetzt ist, brauche ich hierfür nochmal die Variablen display1,2,3 (sichtbarer Bereich) und display199,299,399 Kopie unsichtbarer Bereich. Diese Variablen müssen in Page 0 liegen wegen der notwendigen indirekt indizierten Adressierung.

Da die zentrale Playerprintroutine alle Player versorgt, müssen notwendige Variablen definiert werden (tmp1-9, ystore, xstore,beweg und displayzw) - jeder Player hat dann entsprechende Variablen, die den gesamten Zustand des Players beinhalten und jeweils in die Playerhauptroutine übertragen und am Ende wieder rückübertragen werden.

Als nächstes folgen die Definition des Players selber - also wie er aussieht:

Player 11 12 13 definiert einen (!) Player. Alle drei Player in diesem Beispiel greifen also auf die gleiche Maske zu und sehen entsprechend auch gleich aus. Da wir hier drei kleinste Einheiten haben, brauche ich drei Playerdefinitionen jeweils für einen großen Player. player11 definiert also eine Kleinsteinheit (eigentlich sogar 2 nebeneinander). 170,170,0 bedeutet 2 Balken nebeneinander und ein leeres Feld rechts davon. Ich beschreibe also beim printen des Players drei 4 Bit Felder auf dem Bildschirm nebeneinander (Antic D - 4Bit). Darunter das Gleiche nochmal, aber um ein Bit nach rechts verschoben, dann nochmal ein Bit nach rechts und nochmal - wir simulieren hier letztlich ein Feinscroll nach rechts. Nach printen von player11,x (x=0) player11,x (x=1) player11,x (x=2) player11,x (x=3) wird der Player um eins nach rechts versetzt (quasi ein grobscroll) und dann kommt wieder player11,x (x=0) ... das macht die Bewegung nach rechts. Bewegung nach links ist im Prinzip ähnlich, man kommt aber von x=3 und printet bis x=0 Wozu die Masken? Die Masken brauchen wir letztlich, um die Player nicht nur auf den Bildschirm zu printen, sondern um den Player mit dem Bildschirm zu fusionieren. Die Masken sind quasi ein Spiegelbild der Player und bewirken bei einer AND-Verknüpfung mit dem originalen Bildschirminhalt das voher Löschen des Bildschirminhaltes genau da, wo Inhalte des Player hinkommen. Überall da, wo der Player keinen Inhalt hat (also eine Null) soll ja der Bildschirminhalt sichtbar sein und das mache ich halt mit der Maske. Der eigentliche Schritt ist einfach und immer gleich:

Bildschirminhalt AND MaskePlayer EOR Playerinhalt

Das werde ich später nochmal etwas genauer erklären!

in bewegung1,2,3 habe ich mal ganz einfache Bewegungsmuster definiert: 1 = Player nach oben, 3 nach rechts, 5 nach unten, 7 nach links und die ganzen Zwischenstufen 2,4,6,8 für die Schrägbewegungen.

So viel zunächst dazu. Danach erkläre ich das Hauptprogramm - also Aufbau des Testbildschirmes, Ablauf des Programmes und die Startwerte für die drei Player...

Ich hoffe alles ist einigermaßen verständlich, falls nicht, dann gerne nachfragen!

Gruß Peter

Ich finde das mit den Software Sprites von Dir voll cool.

Ich spiele gerade mit den Atari Hardware Player/Missiles rum. Genauer mit der MultiSprite Routine von Tebe/Shanti77. So langsam komme ich hinter das Geheimnis und habe den Source für mich schon stark angepasst.

Hier mal eine Demo: demo-15-sprites-multicolor.mp4

Das es nicht so stark flackert ist dem Altirra Emulator zu verdanken, wenn man in der Configuration unter Video das Frame blending aktiviert. Das entspricht wohl mehr den alten Röhrenmonitoren mit nachleuchtender Plasmaschicht die Älteren wissen was ich meine. 😀

Hier werden 15 Sprites angezeigt, mein nächstes Game braucht allerdings nur max 8-10 Sprites und das auch nur in Single-Color. Werde den Code also für die Single-Sprites noch überarbeiten. Damit es nicht flackert, wenn ich 4 Sprites in einer Zeile zeige. Zudem sind einige Objekte höher als 16 Bytes.

BTW: Der Source-Code von Tebe/Shanti77 ist fürchterlich, sehr viel SMC (Self-Modified-Code), Bedingte Sprünge mit Bxx *+n wird viel verwendet, was in die Hose geht, wenn die zu überspringenden Bytes sich ändern von z.B. 2Byte auf 1Byte (Zero-Page). Da werden Tabellen an Adressen+128 gesucht. Statt 2 Tabellen mit low und high Byte zu verwenden. Dann das polnisch in den Kommentaren/Variablen Namen. Gut das es mittlerweile translate.google.de gibt. Allerdings sind da auch ein paar coole Sachen drin, ein Optimizer der Sprite-Routinen erstellt und die 32 Bytes in weniger als 200 Zyklen in den Player/Missile Grafik kopiert. Schon krass. Mein schnellstes Move braucht dazu ~450Zyklen. Dafür ist es kleiner. Ich schreibe mir den Code jedenfalls so um, das es einfacher ist ihn wieder zu verwenden.

BTW: Das Demo selbst funktioniert so wie es gerade ist nicht mehr sauber auf NTSC Maschinen, weil der Atari einfach nicht schnell genug ist.

LG Lars

Anhänge:

Hallo Lars, vielen Dank für deinen Beitrag. Ich hatte im Netz auch schon einige Beispiele gesehen, wo bis zu 60 Player über den Bildschirm huschen. Ich glaube da wird ganz viel mit DLI gearbeitet. Das Problem erschien mir immer dabei ein Flackern und schwieriges Handling wenn die Player frei überall hinfliegen - dann aauch mit starkem Flackern. Wenn man eine moderate Anzahl von Playern nimmt, kann man das vielleicht viel stabiler hinbekommen - jedenfalls ist die Technik sehr interessant und ich bin höchst interessiert an deiner Analyse. Vielleicht kannst du es "uns" ja hier im Forum auch mir ein paar guten Erklärungen nahebringen - wenn du das möchtest... also ich bin immer sehr interessiert an neuen Techniken. Es ist schon toll, was man aus dieser alten Kiste rausquetschen kann... Gruß Peter

jetzt habe ich doch tatsächlich nach der langen Zeit noch einen relativ elementaren Fehler in der Routine gefunden, anbei jetzt der richtige Code:

            org 4096


dlist   .by 117,117,117
        .by 93,210,155
        .by 93,0,156        
        .by 93,80,156
        .by 93,160,156

        .by 93,0,157
        .by 93,80,157
        .by 221,160,157

        .by 93,0,158
        .by 93,80,158
        .by 93,160,158  

        .by 93,0,159
        .by 93,80,159
        .by 93,160,159  

        .by 93,0,160        
        .by 93,80,160
        .by 93,160,160

        .by 93,0,161
        .by 93,80,161
        .by 221,160,161

        .by 93,0,162
        .by 93,80,162
        .by 93,160,162

        .by 93,0,163
        .by 93,80,163
        .by 93,160,163

        .by 93,0,164        
        .by 93,80,164
        .by 93,160,164

        .by 93,0,165
        .by 93,80,165
        .by 93,160,165

        .by 93,0,166
        .by 93,80,166
        .by 93,160,166  

        .by 93,0,167
        .by 93,80,167
        .by 93,160,167

        .by 93,0,168    
        .by 93,80,168
        .by 93,160,168

        .by 93,0,169
        .by 93,80,169
        .by 93,160,169

        .by 93,0,170
        .by 93,80,170
        .by 93,160,170

        .by 93,0,171
        .by 93,80,171
        .by 93,160,171

        .by 93,0,172
        .by 93,80,172
        .by 93,160,172

        .by 93,0,173
        .by 93,80,173
        .by 93,160,173

        .by 93,0,174
        .by 93,80,174
        .by 93,160,174

        .by 93,0,175
        .by 93,80,175
        .by 93,160,175

        .by 93,0,176    
        .by 93,80,176
        .by 93,160,176

        .by 93,0,177
        .by 93,80,177
        .by 93,160,177

        .by 93,0,178
        .by 93,80,178
        .by 93,160,178

        .by 93,0,179
        .by 93,80,179
        .by 93,160,179

        .by 93,0,180    
        .by 93,80,180
        .by 93,160,180

        .by 93,0,181
        .by 93,80,181
        .by 93,160,181

        .by 93,0,182
        .by 93,80,182
        .by 93,160,182

        .by 93,0,183
        .by 93,80,183
        .by 93,160,183

        .by 93,0,184
        .by 93,80,184
        .by 93,160,184

        .by 93,0,185
        .by 93,80,185
        .by 93,160,185

        .by 93,0,186
        .by 93,80,186
        .by 93,160,186

        .by 93,0,187
        .by 93,80,187
        .by 221,160,187
        .by 65
        .wo dlist


display = 228
display99 = 230
                    ;------ Speicher und Variablen für Player allgemein ----------
display1 = 232
display2 = 234
display3 = 236
display199 = 238
display299 = 240
display399 = 242
tmp1 = 1000     
tmp2 = 1001
tmp3 = 1002
tmp4 = 1003
tmp5 = 1004
tmp6 = 1005
tmp7 = 1006
tmp8 = 1007
tmp9 = 1008
displayzw = 1009
ystore = 1011
xstore = 1012
beweg = 1013

randomp .by 00

                ;------ Variablen für die Warteschleifen -----------------------
delay = 1020
schleife1 = 1021
schleife2 = 1022
                ;------ Variablen für Player1 ----------------------------------
zaehler1 = 1100
display11 = 1102
display21 = 1104
display31 = 1106
tmp11 = 1108        
tmp21 = 1109
tmp31 = 1110
tmp41 = 1111
tmp51 = 1112
tmp61 = 1113
tmp71 = 1114
tmp81 = 1115
tmp91 = 1116
displayzw1 = 1117
ystore1 = 1118
xstore1 = 1119

                ;------ Variablen für Player2 ----------------------------------

zaehler2 = 1120
display12 = 1122
display22 = 1124
display32 = 1126
tmp12 = 1128        
tmp22 = 1129
tmp32 = 1130
tmp42 = 1131
tmp52 = 1132
tmp62 = 1133
tmp72 = 1134
tmp82 = 1135
tmp92 = 1136
displayzw2 = 1137
ystore2 = 1138
xstore2 = 1139
                ;------ Variablen für Player3 ----------------------------------

zaehler3 = 1140
display13 = 1142
display23 = 1144
display33 = 1146
tmp13 = 1148        
tmp23 = 1149
tmp33 = 1150
tmp43 = 1151
tmp53 = 1152
tmp63 = 1153
tmp73 = 1154
tmp83 = 1155
tmp93 = 1156
displayzw3 = 1157
ystore3 = 1158
xstore3 = 1159
                ;---------------------------------------------------------------

player11    .by 170,170,0
            .by 42,170,128
            .by 10,170,160
            .by 2,170,168
player12    .by 85,85,0
            .by 21,85,64
            .by 5,85,80
            .by 1,85,84
player13    .by 170,170,0
            .by 42,170,128
            .by 10,170,160
            .by 2,170,168           
maske11     .by 0,0,255
            .by 192,0,63
            .by 240,0,15
            .by 252,0,3
maske12     .by 0,0,255
            .by 192,0,63
            .by 240,0,15
            .by 252,0,3
maske13     .by 0,0,255
            .by 192,0,63
            .by 240,0,15
            .by 252,0,3

bewegung1   .by 3,3,3,4,4,5,5,5,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,5,5,5,6,7,7,7,7,7,7,8,1,1,1,1,1,1,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,2
bewegung2   .by 5,5,5,5,5,5,5,5,5,5,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3     
bewegung3   .by 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,5,5,5,5,5,5,5,5,5,5     

            .proc main
            mwa #39936 display      ;--- hier fängt die Bildschirmadresse an 0,156 = 256x156
            mwa #30720 display99
            mwa #dlist 560  
            ldx #0                  ;Bildschirm füllen
            ldy #0
@           inc randomp
            lda randomp
            sta tmp1
            #if .byte tmp1>#40
            ;jmp @-
            #end
            sta (display),y
            sta (display99),y
            iny
            bne @-
            inc display+1
            inc display99+1
            clc
            inx
            cpx #31
            bne @-
            ;-------------------- Variablen Player1 init ---------          
            mva #0 display11
            mva #80 display21
            mva #160 display31
            lda #170
            sta display11+1
            sta display21+1
            sta display31+1
            mva #0 zaehler1
            ldy #34
            sty ystore1
            ;-------------------- Variablen Player2 init ---------          
            mva #0 display12
            mva #80 display22
            mva #160 display32
            lda #173
            sta display12+1
            sta display22+1
            sta display32+1
            mva #0 zaehler2
            ldy #44
            sty ystore2
            ;-------------------- Variablen Player3 init ---------          
            mva #0 display13
            mva #80 display23
            mva #160 display33
            lda #165
            sta display13+1
            sta display23+1
            sta display33+1
            mva #0 zaehler3
            ldy #44
            sty ystore3

;--------------------------Hauptprogramm----------------------------
loop        
            jsr player1
            jsr player2
            jsr player3
            mva #4 delay
            jsr warte2
            jmp loop        
            .endp
;--------------------------Subroutinen------------------------------

            .proc warte2
            mva #0 schleife1
            mva #0 schleife2
@           inc schleife1
            #if .byte schleife1<#255
            jmp @-
            #end
            mva #0 schleife1
            inc schleife2
            #if .byte schleife2<delay
            jmp @-
            #end
            rts
            .endp
            .proc player1
            mwa display11 display1
            mwa display21 display2
            mwa display31 display3
            mva tmp11 tmp1
            mva tmp21 tmp2
            mva tmp31 tmp3
            mva tmp41 tmp4
            mva tmp51 tmp5
            mva tmp61 tmp6
            mva tmp71 tmp7
            mva tmp81 tmp8
            mva tmp91 tmp9
            mva displayzw1 displayzw
            mva ystore1 ystore
            mva xstore1 xstore
            ldx zaehler1
            lda bewegung1,x
            sta beweg
            jsr player.bewegung
            inc zaehler1
            #if .byte zaehler1=#79      
            mva #0 zaehler1
            #end
            mwa display1 display11 
            mwa display2 display21 
            mwa display3 display31 
            mva tmp1 tmp11
            mva tmp2 tmp21
            mva tmp3 tmp31
            mva tmp4 tmp41
            mva tmp5 tmp51
            mva tmp6 tmp61
            mva tmp7 tmp71
            mva tmp8 tmp81
            mva tmp9 tmp91
            mva displayzw displayzw1
            mva ystore ystore1
            mva xstore xstore1
            #if .byte ystore1<=#0
            jsr player.restore
            mva #0 display11
            mva #80 display21
            mva #160 display31
            lda #170
            sta display11+1
            sta display21+1
            sta display31+1
            mva #0 zaehler1
            ldy #34
            sty ystore1
            #end
            rts
            .endp
            .proc player2
            mwa display12 display1
            mwa display22 display2
            mwa display32 display3
            mva tmp12 tmp1
            mva tmp22 tmp2
            mva tmp32 tmp3
            mva tmp42 tmp4
            mva tmp52 tmp5
            mva tmp62 tmp6
            mva tmp72 tmp7
            mva tmp82 tmp8
            mva tmp92 tmp9
            mva displayzw2 displayzw
            mva ystore2 ystore
            mva xstore2 xstore
            ldx zaehler2
            lda bewegung3,x
            sta beweg
            jsr player.bewegung
            inc zaehler2
            #if .byte zaehler2=#79      
            mva #0 zaehler2
            #end
            mwa display1 display12
            mwa display2 display22 
            mwa display3 display32 
            mva tmp1 tmp12
            mva tmp2 tmp22
            mva tmp3 tmp32
            mva tmp4 tmp42
            mva tmp5 tmp52
            mva tmp6 tmp62
            mva tmp7 tmp72
            mva tmp8 tmp82
            mva tmp9 tmp92
            mva displayzw displayzw2
            mva ystore ystore2
            mva xstore xstore2
            #if .byte ystore2<=#0
            jsr player.restore
            mva #0 display12
            mva #80 display22
            mva #160 display32
            lda #173
            sta display12+1
            sta display22+1
            sta display32+1
            mva #0 zaehler2
            ldy #44
            sty ystore2
            #end
            rts
            .endp
            .proc player3
            mwa display13 display1
            mwa display23 display2
            mwa display33 display3
            mva tmp13 tmp1
            mva tmp23 tmp2
            mva tmp33 tmp3
            mva tmp43 tmp4
            mva tmp53 tmp5
            mva tmp63 tmp6
            mva tmp73 tmp7
            mva tmp83 tmp8
            mva tmp93 tmp9
            mva displayzw3 displayzw
            mva ystore3 ystore
            mva xstore3 xstore
            ldx zaehler3
            lda bewegung2,x
            sta beweg
            jsr player.bewegung
            inc zaehler3
            #if .byte zaehler3=#79      
            mva #0 zaehler3
            #end
            mwa display1 display13
            mwa display2 display23 
            mwa display3 display33 
            mva tmp1 tmp13
            mva tmp2 tmp23
            mva tmp3 tmp33
            mva tmp4 tmp43
            mva tmp5 tmp53
            mva tmp6 tmp63
            mva tmp7 tmp73
            mva tmp8 tmp83
            mva tmp9 tmp93
            mva displayzw displayzw3
            mva ystore ystore3
            mva xstore xstore3
            #if .byte ystore3<=#0
            jsr player.restore
            mva #0 display13
            mva #80 display23
            mva #160 display33
            lda #165
            sta display13+1
            sta display23+1
            sta display33+1
            mva #0 zaehler3
            ldy #44
            sty ystore3
            #end
            rts
            .endp
            .proc player
bewegung    #if .byte beweg=#7
            jsr player.nachlinks
            #end
            #if .byte beweg=#3
            jsr player.nachrechts
            #end
            #if .byte beweg=#5
            jsr player.nachunten
            #end
            #if .byte beweg=#1
            jsr player.nachoben
            #end
            #if .byte beweg=#2
            jsr player.nachoben
            jsr player.nachrechts
            #end
            #if .byte beweg=#4
            jsr player.nachunten
            jsr player.nachrechts
            #end
            #if .byte beweg=#8
            jsr player.nachoben
            jsr player.nachlinks
            #end
            #if .byte beweg=#6
            jsr player.nachunten
            jsr player.nachlinks
            #end
            rts

nachoben    
            ldy ystore      
            ldx xstore
            jsr restore
            mva display1 displayzw
            #if .byte displayzw=#160
            mva #80 display1
            mva #160 display2
            dec  display2+1
            mva #0 display3
            #end
            #if .byte displayzw=#80
            mva #0 display1
            mva #80 display2
            mva #160 display3
            dec display3+1
            #end
            #if .byte displayzw=#0
            mva #160 display1
            dec display1+1
            mva #0 display2
            mva #80 display3
            #end
            ldy ystore
            jsr store
            ldy ystore      
            ldx xstore
            jsr print
            jsr store
            rts
nachunten   
            ldy ystore  
            ldx xstore
            jsr restore
            mva display3 displayzw
            #if .byte displayzw=#160
            mva #0 display3
            inc display3+1
            mva #80 display1
            mva #160 display2
            #end
            #if .byte displayzw=#0
            mva #80 display3
            mva #0 display2
            inc display2+1
            mva #160 display1
            #end
            #if .byte displayzw=#80
            mva #160 display3
            mva #80 display2
            mva #0 display1
            inc display1+1
            #end
            ldy ystore
            ldy ystore
            ldx xstore
            jsr print
            jsr store
            rts
nachrechts  
            ldy ystore
            ldx xstore
            inx
            inx
            inx
            stx xstore
            #if .byte xstore=#12
            ldx #0 
            stx xstore
            jsr restore
            mva tmp2 tmp1
            mva tmp3 tmp2
            mva tmp5 tmp4
            mva tmp6 tmp5
            mva tmp8 tmp7
            mva tmp9 tmp8
            inc ystore
            ldy ystore
            iny
            iny
            lda (display1),y
            sta tmp3
            clc
            ldy ystore
            iny
            iny
            lda (display2),y
            sta tmp6
            clc
            ldy ystore
            iny
            iny
            lda (display3),y
            sta tmp9
            ldy ystore
            #end
            jsr print
            jsr store
            #if .byte ystore=#45
            dey
            #end
            rts
nachlinks
            ldy ystore
            ldx xstore
            dex
            dex
            dex
            stx xstore
            #if .byte xstore=#253
            ldx #9
            stx xstore
            jsr restore
            mva tmp2 tmp3
            mva tmp1 tmp2
            mva tmp5 tmp6
            mva tmp4 tmp5
            mva tmp8 tmp9
            mva tmp7 tmp8
            dec ystore
            ldy ystore
            lda (display1),y
            sta tmp1
            clc
            ldy ystore
            lda (display2),y
            sta tmp4
            clc
            ldy ystore
            lda (display3),y
            sta tmp7
            ldy ystore
            #end    
            jsr print
            jsr store
            #if .byte ystore=#1
            iny
            #end
            rts     
print                               ;Player printen + Fusion Bildschirm
            lda tmp1
            and maske11,x
            eor player11,x
            sta (display1),y
            inx
            iny
            lda tmp2
            and maske11,x
            eor player11,x
            sta (display1),y
            inx
            iny
            lda tmp3
            and maske11,x
            eor player11,x
            sta (display1),y
            ldx xstore
            clc
            ldy ystore
            lda tmp4
            and maske12,x
            eor player12,x
            sta (display2),y
            inx
            iny
            lda tmp5
            and maske12,x
            eor player12,x
            sta (display2),y
            inx
            iny
            lda tmp6
            and maske12,x
            eor player12,x
            sta (display2),y
            ldx xstore
            clc
            ldy ystore
            lda tmp7
            and maske13,x
            eor player13,x
            sta (display3),y
            inx
            iny
            lda tmp8
            and maske13,x
            eor player13,x
            sta (display3),y
            inx
            iny
            lda tmp9
            and maske13,x
            eor player13,x
            sta (display3),y

            rts
store                   ;Bildschirm in tmp sichern

            sec
            lda display1+1
            sbc #36
            sta display199+1
            sec
            lda display2+1
            sbc #36
            sta display299+1
            sec
            lda display3+1
            sbc #36
            sta display399+1
            mva display1 display199
            mva display2 display299
            mva display3 display399

            ldy ystore

            lda (display199),y          
            sta tmp1
            iny
            lda (display199),y      
            sta tmp2
            iny
            lda (display199),y          
            sta tmp3
            clc
            ldy ystore

            lda (display299),y          
            sta tmp4
            iny
            lda (display299),y      
            sta tmp5
            iny
            lda (display299),y          
            sta tmp6
            clc
            ldy ystore

            lda (display399),y          
            sta tmp7
            iny
            lda (display399),y      
            sta tmp8
            iny
            lda (display399),y          
            sta tmp9
            rts
restore                         ;tmp in Bildschirm printen (restore)
            lda tmp1
            sta (display1),y
            iny
            lda tmp2
            sta (display1),y            
            iny 
            lda tmp3
            sta (display1),y
            clc
            ldy ystore

            lda tmp4
            sta (display2),y
            iny
            lda tmp5
            sta (display2),y            
            iny 
            lda tmp6
            sta (display2),y
            clc
            ldy ystore

            lda tmp7
            sta (display3),y
            iny
            lda tmp8
            sta (display3),y            
            iny 
            lda tmp9
            sta (display3),y

            rts
            .endp



            run main